#ifndef DLIST_H
#define DLIST_H

#include "comm.h"


/**
 * @brief 双向链表节点结构
*/
typedef struct node
{
	struct node *before;
	void *data;
	struct node *after;
}node_t;

//创建链表
node_t *create_dlist();

//头部插入
int insert_hdlist(node_t *head,const void *data,int size);


/**
 * @brief 节点数据显示函数类型
 * @param data 节点数据指针
 */
typedef void (*showfun_t)(const void *);

//从前往后遍历
void show_hdlist(node_t *head,showfun_t showfun);
//从后往前遍历
void show_tdlist(node_t *head,showfun_t showfun);

//尾部插入
int insert_tdlist(node_t *head,const void *data,int size);


/**
 * @brief 节点数据比较函数类型
 * @param data1 数据指针1
 * @param data2 数据指针2
 * @return int 比较结果
 */
typedef int (*cmpfun_t)(const void *,const void *);
//按值查找
node_t *find_vdlist(node_t *head,const void *value,cmpfun_t cmpfun);


/**
 * @brief 节点数据更新函数类型
 * @param data1 待更新数据指针
 * @param data2 新数据指针
 * @return int 操作状态
 */
typedef int (*updatefun_t)(void *,const void *);
int update_dlist(node_t *head,void *olddata,void *newdata,cmpfun_t cmpfun,updatefun_t updatefun);

//从前面删除
int delete_hdlist(node_t *head);
//从后面删除
int delete_tdlist(node_t *head);
//按值删除
int delete_vdlist(node_t *head,void *value,cmpfun_t cmpfun);

//销毁链表
int destroy_dlist(node_t **head);

#endif
